home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / cursor / cursor.bas < prev    next >
BASIC Source File  |  1995-05-09  |  6KB  |  155 lines

  1. Option Explicit
  2.  
  3. ' Demo by Pierre Fillion (c) 1993 by Synetics Consultation
  4. ' Version 1.1 - 1993/05/10
  5. ' (FEEL FREE TO DISTRIBUTE THE ENTIRE ARCHIVE ONLY WITHOUT MODIFICATIONS)
  6.  
  7. ' I don't ask for any contributions, you may use theses routines freely
  8. ' but, it you release a .vbx or shareware routines, it would be nice
  9. ' to send me a registred copy.
  10.  
  11. ' %%% Special thanks to David Sainsbury for the main routines
  12. ' %%% Very Special thanks to Fred Egger for his help to my color problem
  13.  
  14. '       Any suggestions ? or improvments ?
  15. '       Please drop me a line on CIS 71162,51
  16. '       or to :
  17. '                Pierre Fillion
  18. '                8460 Perras #1
  19. '                Montreal,Quebec
  20. '                H1E 5C7
  21.  
  22. '  Thanks a lot.
  23.  
  24. '------------------------------------------------------------------------
  25. ' Follow theses steps...
  26. '------------------------------------------------------------------------
  27.  
  28. ' Simply add the cursor.bas module to your project.
  29.  
  30. ' Create a picture box (32x32 pixel) for the cursor and an inverted
  31. ' picture box of the first one. (See the .ico included with this demo)
  32. ' -- Use IconWorks that comes with VB or anyother, to create your pictures.
  33. ' -- Don't forget to had a light red pixel to define a hotspot in the icon.
  34.  
  35. ' ******************************* NOTICE ********************************
  36. ' ******* (The inverted picture is the original one with white color
  37. ' *******  changed to screen color and everything else to white)
  38. ' ***********************************************************************
  39.  
  40. ' Use the SetCursor to create the cursor,
  41.  
  42. ' Use RestoreCursor to restore it back to what it was.
  43.  
  44. '------------------------------------------------------------------------
  45.  
  46. ' Function SetCursor (hWnd As Integer, CursorPic As Control,
  47. '                                      CursorPicX As Control) As Integer
  48.  
  49. ' -- hWnd : Handle of the window or control where the cursor will change.
  50. ' -- CursorPic  : Name of the control holding the icon previously created.
  51. '                 Ex:(Picture1)
  52. ' -- CursorPicX : Name of the control holding the inverted icon of CursorPic.
  53. '                 Ex:(Picture2)
  54.  
  55.  
  56. ' Return the handle of the new cursor to be used in RemoveCursor.
  57.  
  58. ' (This routine will call the hotspot routine to find the light red pixel
  59. '  position in CursorPic and set the hotspot.)
  60.  
  61. '------------------------------------------------------------------------
  62. ' Sub RestoreCursor (hWnd As Integer, OldCursor As Integer)
  63.  
  64. ' -- hWnd : Handle of the window or control specified in SetCursor
  65. ' -- OldCursor : Variable containing the handle returned by SetCursor
  66.  
  67. '========================================================================
  68.  
  69. '------------------------------------------------------------------------
  70. 'CURSOR.BAS Declarations
  71. '------------------------------------------------------------------------
  72.  
  73. Declare Function GlobalLock Lib "Kernel" (ByVal hMem As Integer) As Long
  74. Declare Function GlobalUnLock Lib "Kernel" (ByVal hMem As Integer) As Integer
  75. Declare Function CreateCursor Lib "User" (ByVal hInstance%, ByVal nXhotspot%, ByVal nYhotspot%, ByVal nWidth%, ByVal nHeight%, ByVal lpANDbitPlane As Any, ByVal lpXORbitPlane As Any) As Integer
  76. Declare Function GetWindowWord Lib "User" (ByVal hWnd As Integer, ByVal nIndex As Integer) As Integer
  77. Declare Function SetClassWord Lib "User" (ByVal hWnd As Integer, ByVal nIndex As Integer, ByVal nNewWord As Integer) As Integer
  78. Declare Function GetClassWord Lib "User" (ByVal hWnd As Integer, ByVal nIndex As Integer) As Integer
  79. Declare Function GetBitmapBits Lib "Gdi" (ByVal hBitmap As Integer, ByVal dwCount As Long, ByVal lpbits As String) As Long
  80.  
  81. Global Const GCW_HCURSOR = -12
  82. Global Const GWW_HINSTANCE = -6
  83.  
  84. Sub GetHotSpot (CursorPic As Control, xhs As Integer, yhs As Integer)
  85.  
  86.     Dim Ret As Long
  87.     Dim lpbits As String * 1024
  88.     Dim bits As Integer
  89.     
  90.     'Retrieve the cursor bits to check for the hotspot (x,y)
  91.     bits = Val(CursorPic.Image)
  92.     Ret = GetBitmapBits(bits, 1024, lpbits)
  93.     yhs = 0
  94.     xhs = 0
  95.  
  96.     'Find the red pixel x,y position for hotspot location
  97.     For bits = 1 To 1024
  98.         If Mid$(lpbits, bits, 1) = "∙" Then
  99.             yhs = Int(bits / 32) + 1
  100.             xhs = bits - ((yhs - 1) * 32)
  101.         End If
  102.     Next bits
  103.  
  104. End Sub
  105.  
  106. Sub RestoreCursor (hWnd As Integer, OldCursor As Integer)
  107.     
  108.     Dim Ret As Integer
  109.     
  110.     Ret = SetClassWord(hWnd, GCW_HCURSOR, OldCursor)
  111.  
  112. End Sub
  113.  
  114. Function SetCursor (hWnd As Integer, CursorPic As Control, CursorPicX As Control) As Integer
  115.  
  116.     Dim ghInstance As Integer
  117.     Dim lpand As Long, lpandx As Long
  118.     Dim Ret As Integer
  119.     Dim hNewCursor As Integer
  120.     Dim hotx As Integer
  121.     Dim hoty As Integer
  122.     
  123.     'Set the hotspot by retrieving the location of the first
  124.     'picture containing the red pixel
  125.     Call GetHotSpot(CursorPic, hotx, hoty)
  126.     
  127.     'CursorPic  is a picture box control with a 32x32 pixels mono bitmap
  128.     'CursorPicX is an inverted picture box control of the first CursorPic
  129.  
  130.     'The First Picture must contain a light red dot for the hotspot position
  131.  
  132.     '(The CursorPicX is created to allow white & background to be defined ok)
  133.     '(Refer of the .ico files incloded to see how to do it for other cursors)
  134.  
  135.     'hWnd is the handle of the window or control to apply the new cursor to
  136.     
  137.     'Retreive window or control instance and pictures adresses
  138.     SetCursor = GetClassWord(hWnd, GCW_HCURSOR)
  139.     ghInstance = GetWindowWord(hWnd, GWW_HINSTANCE)
  140.     lpand = GlobalLock(CursorPic.Picture)
  141.     lpandx = GlobalLock(CursorPicX.Picture)
  142.     
  143.     'Set the cursor
  144.     hNewCursor = CreateCursor(ghInstance, hotx, hoty, 32, 32, lpand + 12, lpandx + 12)
  145.     
  146.     'Free memory
  147.     Ret = GlobalUnLock(CursorPic.Picture)
  148.     Ret = GlobalUnLock(CursorPicX.Picture)
  149.  
  150.     'Apply the cursor to the window or control defined by hWnd
  151.     Ret = SetClassWord(hWnd, GCW_HCURSOR, hNewCursor)
  152.     
  153. End Function
  154.  
  155.